package io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 提高每次实际读写的数据量,减少实际读写的次数可以提高读写效率.
 * 单字节读写是一种随机读写形式.而一组字节的读写是  块  读写形式.
 */
public class CopyDemo02 {
    public static void main(String[] args) throws IOException {
        /** int read(byte[] data) 块读操作 */
        //InputStream中定义了块读操作:
        /*
            字节流提供了块读写对应的方法。
            InputStream中定义了块读操作:
            int read(byte[] data)
            一次性读取给定的字节数组总长度的字节量并存入到该数组中。返回值为实际读取到的字节量。
            如果返回值为-1则表示本次没有读取到任何字符并且这里已经是流的末尾了。

            以文件流读取文件为例:
            文件数据:
            00001111 01010101 11110000 11010011 11000011

            byte[] data = new byte[3];{00000000,00000000,00000000}
            int len;

            使用文件流块读一次:
            len = fis.read(data);//读取3个字节(原因是data数组长度为3)
            data:{00001111,01010101,11110000}//读取的3个字节存入data数组
            len = 3;//实际读取到了3个字节

            使用文件流块读二次:
            len = fis.read(data);//读取2个字节(原因是文件只剩下2个字节了)
            data:{11010011,11000011,11110000}//读取的2个字节存入data数组的前2个位置
                  ^^^^^^^^ ^^^^^^^^这两个字节是本次读取到的字节
            len = 2;//实际读取到了2个字节

            使用文件流块读三次:
            len = fis.read(data);//读取0个字节(原因是已经是文件末尾了)
            data:{11010011,11000011,11110000}//没读取到数据，数组没变化
            len = -1;//-1表示本次没有读取到字节，已经是文件末尾了



            OutputStream字节输出流中定义了块写操作
            void write(byte[] data)
            一次性将给定的字节数组中所有字节写出

            void write(byte[] data,int offset,int len)
            一次性将给定的字节数组从下标offset处开始的连续len个字节写出
         */
        /*
            字节单位:
            00000000 8位2进制称为1byte  1字节
            1024byte   1kb
            1024kb     1mb
            1024mb     1gb
            1024gb     1tb
         */
        /** void write(byte[] data) */
        //OutputStream字节输出流中定义了块写操作:
        FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\balabala.jpg");
        //当重新书写，写入OutputStream操作时，原本那个复制的文件则被清除，进行重新书写!!
        /*
            文件输出流默认----的构造方法----创建时-----如果指定的文件----存在-----,会将该文件数据---------抹除.

            文件流也支持追加模式,就是在实例化时再传入一个boolean型参数,如果这个值为true则
            是追加模式.即:指定的文件若存在,该文件数据全部保留,当前文件流会从文件末尾开始接着写新的数据.
         */
        FileOutputStream fos = new FileOutputStream("image_po02.png");
//        byte[] data = new byte[1024*10];
//        int len;//每次实际读取到的字节数量
//        long start = System.currentTimeMillis();
//        while( (len = fis.read(data)) !=-1 ){
//            fos.write(data);
//            System.out.println(len);
//        }
        //上述复制，会比原文件大，则下面案列吧！！

        /** void write(byte[] data,int offset,int len) *//*重载方法*/
        byte[] data = new byte[1024*10];
        int len;//每次实际读取到的字节数量
        long start = System.currentTimeMillis();
        while( (len = fis.read(data)) !=-1 ){
            fos.write(data,0,len);
            System.out.println(len);
        }
        long end = System.currentTimeMillis();
        System.out.println("复制完毕!耗时:"+(end-start)+"毫秒");
        System.out.println("复制完毕!");

        fis.close();
        fos.close();










    }
}
